package com.doublethread.easymart.modules.product.controller;

import com.doublethread.easymart.common.result.PageResult;
import com.doublethread.easymart.common.result.Result;
import com.doublethread.easymart.modules.product.dto.ProductDTO;
import com.doublethread.easymart.modules.product.dto.ProductQueryDTO;
import com.doublethread.easymart.modules.product.dto.ProductUpdateStatusDTO;
import com.doublethread.easymart.modules.product.dto.ProductUpdateStockDTO;
import com.doublethread.easymart.modules.product.service.ProductService;
import com.doublethread.easymart.modules.product.vo.ProductStatisticsVO;
import com.doublethread.easymart.modules.product.vo.ProductVO;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 管理端商品控制器
 */
@Slf4j
@RestController
@RequestMapping("/api/admin/products")
public class AdminProductController {

    @Autowired
    private ProductService productService;

    /**
     * 获取商品列表
     */
    @GetMapping
    public Result<PageResult<ProductVO>> getProductList(ProductQueryDTO queryDTO) {
        log.info("管理端查询商品列表");

        PageResult<ProductVO> pageResult = productService.getAdminProductList(queryDTO);

        log.info("管理端查询商品列表成功");

        return Result.success(pageResult);
    }

    /**
     * 获取商品详情
     */
    @GetMapping("/{id}")
    public Result<ProductVO> getProductById(@PathVariable Long id) {
        log.info("管理端获取商品详情");

        ProductVO productVO = productService.getAdminProductById(id);

        log.info("管理端获取商品详情成功");
        return Result.success(productVO);
    }

    /**
     * 添加商品
     */
    @PostMapping
    public Result<ProductVO> createProduct(@Valid @RequestBody ProductDTO productDTO) {
        log.info("创建商品");

        ProductVO productVO = productService.createProduct(productDTO);

        log.info("商品创建成功");
        return Result.success(productVO);
    }

    /**
     * 更新商品
     */
    @PutMapping("/{id}")
    public Result<Void> updateProduct(@PathVariable Long id,
                                      @Valid @RequestBody ProductDTO productDTO) {
        log.info("更新商品");

        productService.updateProduct(id, productDTO);

        log.info("商品更新成功");
        return Result.success();
    }

    /**
     * 删除商品
     */
    @DeleteMapping("/{id}")
    public Result<Void> deleteProduct(@PathVariable Long id) {
        log.info("删除商品");

        productService.deleteProduct(id);

        log.info("商品删除成功");
        return Result.success();
    }

    /**
     * 更新商品状态
     */
    @PutMapping("/{id}/status")
    public Result<Void> updateProductStatus(@PathVariable Long id,
                                            @Valid @RequestBody ProductUpdateStatusDTO statusDTO) {
        log.info("更新商品状态");

        productService.updateProductStatus(id, statusDTO);

        log.info("商品状态更新成功");
        return Result.success();
    }

    /**
     * 更新商品库存
     */
    @PutMapping("/{id}/stock")
    public Result<Void> updateProductStock(@PathVariable Long id,
                                           @Valid @RequestBody ProductUpdateStockDTO stockDTO) {
        log.info("更新商品库存");

        productService.updateProductStock(id, stockDTO);

        log.info("商品库存更新成功");
        return Result.success();
    }

    /**
     * 获取商品统计信息
     */
    @GetMapping("/statistics")
    public Result<ProductStatisticsVO> getProductStatistics() {
        log.info("获取商品统计信息");

        ProductStatisticsVO statistics = productService.getProductStatistics();

        log.info("获取商品统计信息成功");

        return Result.success(statistics);
    }
}
